package com.dingding.common.core.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.dingding.common.core.config.SystemConfig;
import com.dingding.common.core.util.amap.AmapConfig;
import com.dingding.common.core.util.prop.PropKit;
import com.dingding.common.core.util.tools.QR.ImgQrTool;
import com.dingding.common.core.util.tools.wechat.WechatCode;
import com.dingding.common.core.util.tools.wechat.WechatTool;

/**
 * @Description:统一Url获取工具类
 * @author fengshuonan
 * @date 2016年4月25日 上午11:57:55
 */
public class UrlMaker {

	// 根据当前是否为测试环境，拼接上_test后缀
	private static String addPostfix(String name) {
		return name + (SystemConfig.isEnv_system() == false ? "_test" : "");
	}

	// 获取支付宝需要接口的url
	public static String getAlipayUrl() {
		return regex("client_alipay");
	}

	// 获取服务器端接口的url
	public static String getAppServerUrl() {
		return regex("client_app_server");
	}

	// 获取web页面访问的的url
	public static String getWebUrl() {
		return regex("client_web");
	}

	// 获取洗车券二维码扫描后的url
	public static String getQRcodeLinkUrl(String couponId) {
		return regex("client_qrcode_link", couponId);
	}

	/**
	 * @Description: 获取优惠券微信分享链接的url
	 * @param couponType
	 *            优惠券类型（1：洗车券 2：代金券）
	 * @param couponMoney
	 *            优惠券金额
	 * @author fengshuonan
	 */
	public static String getWechatShareUrl(String couponType, String couponMoney) {
		return regex("client_wechat_share", couponType, couponMoney);
	}

	// 通过微信返回的code获取用户openid的url
	public static String getOpenidByCodeUrl(String code) {
		return regex("wechat_get_openid_url", WechatCode.appID, WechatCode.appSecret, code);
	}

	// 获取微信的access_token
	public static String getWechatAccessTokenUrl() {
		return regex("wechat_get_access_token_url", WechatCode.appID, WechatCode.appSecret);
	}

	// 获取jsapi的url
	public static String getWechatJsapiUrl() {
		return regex("wechat_get_jsapi_url", WechatTool.getAccessToken());
	}

	// 获取微信ticket的url（用于带参数的二维码的生成）
	public static String getWechatTicketUrl() {
		return regex("wechat_qrfocus_ticket_url", WechatTool.getAccessToken());
	}

	// 获取微信支付回调地址
	public static String getWechatPayNotifyUrl() {
		return regex("wechat_pay_notify");
	}

	// 获取微信生成带参数二维码的url
	public static String getQrpicUrl(String ticket) {
		return regex("wechat_get_qrpic_url", ticket);
	}

	// 高德地图获取城市名称的url
	public static String getCityNameUrl(String code, String placeName) {
		return regex("amap_get_city_url", code, placeName);
	}

	// 高德地图获取城市名称的url
	public static String getPosiInfoUrl(String code, String placeName, String cityName) {
		return regex("amap_get_posi_url", code, placeName, cityName);
	}

	// 获取微信公众号中跳转到注册页面的rul
	public static String getWechatUserRegPageUrl(String openId) {
		return regex("wechat_user_reg_page", openId);
	}

	// 获取访问webview的服务器的地址
	public static String getWebViewServer() {
		return regex("client_web_view");
	}
	
	//获取距离的url
	public static String getAmapDistanceUrl(String origins,String destination){
		return regex("amap_get_distance_url",AmapConfig.GAODE_WEB_API_KEY,origins,destination);
	}
	
	//获取微信授权url
	public static String getWechatAuthUrl(String url){
		return regex("wechat_get_openid_redirect",url);
	}
	
	//通用活动的分享出去的url
	public static String getUniversalActivityUrl(String shareKey,String activityId){
		return regex("activity_universal_share",shareKey,activityId);
	}

	/**
	 * 说明:根据properties文件中的propertyName获取对应的value值，
	 * 并把或得到的value中的所有"[param]"正则替换为params中包含的值
	 *
	 * properties中url的属性名称命名规范： 1.propName的名字开头为properties文件的名称
	 * 例如：客户端需要的服务器的地址参数名为client_app_server，这个参数的值在client.properties文件中
	 * 
	 * 2.如果一个url有正式环境和测试环境两种情况，则propName不以"_url"结尾，
	 * 例如：客户端需要的正式环境的接口地址名为client_app_server，测试的为client_app_server_test
	 * 
	 * 3.如果一个url不分正式测试环境，则propName以"_url"结尾 例如：获取微信access
	 * tocken的properName为wechat_get_access_token_url
	 * 
	 * 4.获取到的url值中需要拼接参数的都用"[param]"来替代拼接部分，拼接值时用正则匹配"\\[param\\]"
	 * 例如：https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[param]&secret=[param]
	 * 
	 * @param propName
	 *            prop文件中变量的参数名称
	 * @param params
	 * @return
	 * @author fengshuonan
	 * @return String
	 */
	public static String regex(String propName, String... params) {
		if (ToolUtil.isBlank(propName)) {
			return null;
		}
		int fileNameIndex = propName.indexOf("_");
		String fileName = "/url/" + propName.substring(0, fileNameIndex) + ".properties";
		if (!propName.endsWith("url")) {
			propName = addPostfix(propName);
		}
		String url = PropKit.use(fileName).get(propName);
		if (ToolUtil.isBlank(url)) {
			return null;
		}
		Pattern p = Pattern.compile("\\[param\\]");
		Matcher m = p.matcher(url);
		if (params.length != 0) {
			for (int i = 0; m.find(); i++) {
				url = m.replaceFirst(params[i]);
				m = p.matcher(url);
			}
		}
		return url;
	}

	/**
	 * @Description: 生成二维码图片
	 * @author fengshuonan
	 */
	public static void main(String[] args) {

		System.out.println("当前公众号为：" + (WechatCode.appID.equals("wxb36d3ec4a768b571") == true ? "正式微信" : "测试微信"));

		// 生成二维码图片
		generateCode(201,213);

	}

	private static void generateCode(int begin, int end) {
		// 生成二维码图片
		for (int i = begin; i <= end; i++) {

			System.out.println("第" + i + "个推广号：" + WechatTool.getOfficialQrUrl(i) + "\n");

			ImgQrTool.encode(WechatTool.getOfficialQrUrl(i), 500, 500, "F:\\二维码生成文件夹\\source.png",
					"F:\\二维码生成文件夹\\test\\" + (i) + ".jpg");

			// ImgQrTool.createSimpleQr(WechatTool.getOfficialQrUrl(i), 500,
			// 500, "F:\\二维码生成文件夹\\07-12\\" + i % 100 + ".jpg");
		}
	}

}
